package com.iecm.udp.handler;

import com.alibaba.fastjson.JSONObject;
import com.iecm.common.config.RabbitConfig;
import com.iecm.common.utils.DateUtil;
import com.iecm.common.utils.NettyUtil;
import com.iecm.common.utils.RabbitUtil;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * udp服务数据处理类
 */
@Component
@ChannelHandler.Sharable
@Slf4j
public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {

    @Autowired
    private RabbitConfig rabbitConfig;

    @Autowired
    private RabbitUtil rabbitUtil;

    /**
     * 活跃的、有效的通道
     * 第一次连接成功后进入的方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
    }

    /**
     * 拿到传过来的msg数据，开始处理
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {
        String datas = NettyUtil.hexByteStr(msg.content());
        log.info("UDP服务端接收到" + ctx.channel().id().asLongText() + "的数据: " + datas);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("datas", datas);
        jsonObject.put("createTime", DateUtil.getNowDate());

        rabbitUtil.writeToServer(rabbitConfig.tempQueue().getName(), jsonObject);
    }

    /**
     * 异常处理
     *
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
        //发生异常，关闭连接
        log.error("通道异常");
        ctx.disconnect();//再次建议close
    }
}
